package com.kitbox.hl.meshow.bpm.service;



import com.kitbox.hl.meshow.bpm.bean.BPMWorkItem;
import com.kitbox.hl.meshow.bpm.bean.BpmNodeVo;
import com.kitbox.hl.meshow.bpm.bean.WFActivityInst;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface IBpmService {
    /**
     *创建并启动流程【用户ID、流程定义名称、流程实例名称、流程实例描述、是否启动】  返回实例ID
     * @param userID
     * @param processDefName
     * @param processInstName
     * @param processInstDesc
     * @param isStart
     * @return
     */
    public String createProcessInstance(String userID, String processDefName, String processInstName, String processInstDesc, Boolean isStart)throws Exception;

    /**
     查询待办工作项【用户ID、参与者ID、执行权限、任务来源】
     执行权限ALL(全部)|PUBLIC(公共)|PRIVATE(个人)(PUBLIC,PRIVATE可以形成组合)用逗号隔开
     任务来源ALL(全部)|SELF(自己)|AGENT(代理)|DELEG(代办)|HELP(协办)(SELF,AGENT,DELEG,HELP可以形成组合)用逗号隔开
     返回WorkItems 列表
     * @param userID
     * @param personID
     * @param permission
     * @param scope
     * @return  List<BPMWorkItem>
     */
    public List<BPMWorkItem> queryPersonWorkItems(String userID, String personID, String permission, String scope) throws Exception;

    /**
     * 指派后继活动的参与者
     * @param userId  用户ID
     * @param workItemID  工作项ID
     * @param activityDefID  活动定义ID
     * @param participantsxml  XML格式的参与者，示例见备注
     *
     *  <?xml version='1.0'encoding='UTF8'>
     *  <list>
     *   <Participant>
     * 	    <id>superadmin</id>
     * 	    <name>superadmin</name>
     * 	    <type>01</type>
     * 	</Participant>
     * <Participant>
     * 	    <id>lisi</id>
     * 	    <name>李四 </name>
     * 	    <type>01</type>
     *  </Participant>
     * </list>
     *
     * @return
     * @throws Exception
     */
    String appointActivityParticipant(String userId, long workItemID, String activityDefID,
                                      String participantsxml) throws Exception;


    /**
     * 签收任务
     * @param userID
     * @param workItemid
     * @return 执行结果，0表示成功，-1失败
     * @throws Exception
     */
    String assignWorkItemToSelf(String userID, long workItemid) throws Exception;

    /**
     * 签收并完成工作项
     * @param userID
     * @param workItemid
     * @param relativeData
     * @param checkPermission
     * @return 执行结果，0表示成功，-1失败
     * @throws Exception
     */
    String assignAndFinishWorkItemWithOption(String userID, long workItemid, String relativeData, boolean checkPermission) throws Exception;


    /**
     查询指定人员完成的工作项【用户ID、参与者ID、任务来源、是否包含历史表】
     任务来源ALL(全部)|SELF(自己)|AGENT(代理)|DELEG(代办)|HELP(协办)(SELF,AGENT,DELEG,HELP可以形成组合)用逗号隔开
     返回WorkItems 列表
     * @param userID
     * @param personID
     * @param permission
     * @param includeHistory
     * @return  List<BPMWorkItem>
     */
    public List<BPMWorkItem> queryPersonFinishedWorkItems(String userID, String personID, String permission, Boolean includeHistory) throws Exception;

    /**
     * 根据流程实例id查询工作项的信息（包含审批意见和审批动作）
     * 流程实例ID
     * 是否包含历史表
     * @param ProcessInstId
     * @param includeHistory
     * @return
     */
    public List<BPMWorkItem> queryWorkItemsAndReviewByProcessInstId(long ProcessInstId, Boolean includeHistory) throws IOException;
    /**
     * 查询某个流程实例的的所有待办和已办的工作项
     * 用户ID
     * 参与者ID
     * 执行权限
     * 任务来源
     * 是否包含历史表
     * 流程实例ID
     * @param userID
     * @param personID
     * @param permission
     * @param scope
     * @param includeHistory
     * @param processInstID
     * @return  List<BPMWorkItem>
     */
    public List<BPMWorkItem> queryPersonAllWorkItems(String userID, String personID, String permission, String scope, Boolean includeHistory, long processInstID) throws Exception;


    /**
     * 查询用户待办和完成的工作项信息（包含审批意见和审批动作），可以根据用 流程实例id、是否包含历史表 ，作为查询条件。
     * @param ProcessInstId
     * @param includeHistory
     * @return
     */
    public List<BPMWorkItem> queryBacklogAndFinishWorkItemsByProcessInstId(String ProcessInstId, boolean includeHistory) throws Exception;


    /**
     完成活动实例【用户ID、活动实例ID】  返回执行结果 无
     * @param userID
     * @param activityInstID
     */
    public void finishActivityInstance(String userID, long activityInstID) throws Exception;

    /**
     完成活动实例【用户ID、工作项ID、相关数据列表、是否需要校验权限】  返回执行结果，0表示成功，-1失败,
     * @param userID
     * @param workItemid
     * @param relativeData  参数格式：key1:value1,key2:value2     String relativeData="key:value"
     * @param checkPermission
     */
    public String finishWorkItemWithOption(String userID, long workItemid, String relativeData, boolean checkPermission) throws Exception;

    /**
     * 批量改派 指定参与者【用户ID、JSON数据】
     * jsonStr  格式:
     * [
     *   {
     *     "personID":"goose",--参与者ID
     *     "workItemID":1111 --工作项ID
     *   },
     *   {
     *     "personID":"goose",
     *     "workItemID":2222
     *   }
     * ]
     */
    public String batchReassignWorkItem(String userID, String jsonStr) throws Exception;

    /**
     * 查询某个活动实例的前驱实例
     * @param userID
     * @param activityInstID   活动实例ID
     * @return
     * @throws Exception
     */
    WFActivityInst queryPreviousActivityInstances(String userID, long activityInstID) throws Exception;


    /**
     * 根据某策略  回退  到某活动实例【用户ID、活动实例ID、目标活动实例ID、回退策略】  返回执行结果 无
     * @param userId
     * @param currentActInstID
     * @param destActInstID    目标活动实例ID
     * @param rollBackStrategy
     *
     * rollBackStrategy回退策略：
     * path （基于两点间的路径回退）
     * recent_manual （回退到最近的人工活动）
     * one_step （单步回退）
     * simple （简单回退）
     */
    public void backActivity(String userId, long currentActInstID, long destActInstID, String rollBackStrategy) throws Exception;


    /**
     * 根据某策略  回退  到某活动实例【用户ID、活动实例ID、目标活动定义id、回退策略】  返回执行结果 无
     * @param userId
     * @param currentActInstID
     * @param destActDefID    目标活动定义id    是指回退到的目标活动定义ID，将根据此活动定义ID查找最新的活动实例进行回退。
     * @param rollBackStrategy
     *
     * rollBackStrategy回退策略：
     * path （基于两点间的路径回退）
     * recent_manual （回退到最近的人工活动）
     * one_step （单步回退）
     * simple （简单回退）
     */
    public void backDefActivity(String userId, long currentActInstID, String destActDefID, String rollBackStrategy) throws Exception;


    /**
     * 改变  流程实列的状态
     *
     * 用户ID
     * 流程实例ID
     * 流程实例的目标状态
     * 返回值描述
     * 执行结果，0表示成功，-1失败
     * @param userID
     * @param processInstID
     * @param destState
     * 参数 destState 的可取值：2（运行）、3（挂起）、7（完成）、8（终止）
     * 注：
     * 1、流程修改为终止状态后，不能再修改为运行、挂起、完成状态。
     * 2、流程修改为挂起状态后，不能直接修改为完成状态，可以修改为运行状态，然后再修改为完成状态。可以直接修改为终止状态。
     * 3、流程修改为完成状态后，不能再修改为运行，挂起、终止状态。
     */
    public String changeProcessInstState(String userID, long processInstID, int destState) throws Exception;

    /**
     * 终止某个流程实例
     * 用户ID
     * 流程实例ID
     * 执行结果，0表示成功，-1失败
     * */
    public String terminateProcessInstance(String userID, long processInstID) throws Exception;

    /**
     *查询个活动实例的状态
     * 返回值可能的取值：
     * 1（未运行）、10（待激活）、2（运行）、3（挂起）、7（完成）、8（终止）、-1（应用异常）、6（取消）
     */
    public String getActivityInstState(String userID, long activityInstID) throws Exception;

    /**
     *删除活动实例 【用户ID，活动实例ID】
     * 返回值可能的取值：
     * 1（未运行）、10（待激活）、2（运行）、3（挂起）、7（完成）、8（终止）、-1（应用异常）、6（取消）
     */
    public String  removeActivityInstance(String userID, long actInstID) throws Exception;

    /**
     * 重新启动某个活动实例【用户ID，活动实例ID】
     * @param userID
     * @param activityInstID
     */
    public void restartActivityInstance(String userID, long activityInstID) throws Exception;

    /**
     * 恢复某个活动实例的状态为运行状态【用户ID，活动实例ID】
     * @param userID
     * @param activityInstID
     * 要求活动实例的状态处于挂起状态，否则会抛异常
     */
    public void resumeActivityInstance(String userID, long activityInstID) throws Exception;
    /**
     * 挂起某个活动实例【用户ID，活动实例ID】
     * @param userID
     * @param activityInstID
     * 要求活动实例的状态处于运行状态,否则会抛异常
     */
    public void suspendActivityInstance(String userID, long activityInstID) throws Exception;

    /**
     * 终止活动实例【用户ID，活动实例ID】
     * @param userID
     * @param activityInstID
     * 1.如果活动实例不存在会抛异常；
     * 2.如果活动实例的状态处于完成或者终止状态会抛异常
     */
    public void terminateActivityInstance(String userID, long activityInstID) throws Exception;

    /**
     * 通过业务流程ID获取整个业务流程
     * @param userID
     * @param processDefID
     * @return
     */
    public List<BpmNodeVo> getProcess(String userID, long processDefID) throws Exception;

    /**
     * 通过流程实例 ID  流程实例状态
     * @param userID
     * @param //processDefID
     * @return
     */
    public String getProcessInstState(String userID, long processInstID)  throws Exception;



}
